package sight.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author huu
 * @create 2025-08-24-19:16
 * @ description：使用策略模式去除大量的if-else
 */
@RestController
public class CustomerController {
    //创建一个map存储策略,我们的Service实现类给了Spring管理，自动注入
    private Map<UserType, Service> serviceMap;

    @GetMapping("/customer/{recharge}")
    public String customer(@PathVariable(value = "recharge" )int recharge){
//        if(recharge > 0 && recharge <= 100){
//            return "普通玩家客服";
//        }
//        if(recharge > 100 && recharge <= 500){
//            return "VIP玩家客服";
//        }
//        if(recharge > 500 && recharge <= 1000){
//            return "SuperVIP玩家客服";
//        }
//        return "找不到客服";
        //1.抽象具体策略逻辑，这里使用一个接口，然后使用具体实现类分类，SUPER，VIP，NORMAL
        //2.抽象策略，通过不同策略条件跳转到不同的策略具体实现,我们可以有一个策略工厂类，根据条件返回对应的策略对象--UserType枚举类
        //3.完成抽象现在对应起来，建立参数进来获取策略对象，然后调用策略对象方法
        //4.完成策略方法后可以看到，日后需要添加新的我们只需要在UserTypr中添加新的枚举值，然后实现新的策略类，这样就行了
        UserType userType = UserType.getUserType(recharge);
        return serviceMap.get(userType).findService();
    }

    //这里多说一句，策略模式，我们拿到的参数是一个List，然后我们拿到List中的元素，然后获取元素中的注解，然后根据注解的值获取对应的策略对象，然后调用对应的策略方法
    //这里策略模式是Compoment,通过Spring注入的，如果我们实现默认的DefaultService，需要对注入顺序有要求那么使用ORDER注解，这个值越小优先级越高

    @Autowired
    private void setServiceMap(List< Service> serviceList){
        //将List转换成Map,获取自定义注解的值作为key,实现类作为值
        this.serviceMap =
                //拿到serviceList流
                serviceList.stream()
                        //过滤掉没有自定义注解的
                        .filter(service -> service.getClass().isAnnotationPresent(User.class))
                        //收集为map，key为注解的值，value为实现类，使用Collerctors.toMap
                        .collect(Collectors.toMap(this::findUserType, Function.identity()));
    }

    //获取自定义注解信息--------这个方法和自定义注解记一下
    private UserType findUserType(Service service){
        User annotation = service.getClass().getAnnotation(User.class);
        return UserType.valueOf(annotation.value());
    }


}
